#ifndef _NODE_HANDLER
#define _NODE_HANDLER
#define TASK_TYPE_GETLIST   1
#include "ConfigReader.h"
#include "DataFrame.h"
#include "TaskExecutor.h"
#include "SocketIO.h"
#include "Exception.h"
#include<string>
#include<map>
#include<mutex>
class NodeHandler {
    public:
        DataFrame frameHandler;
        std::string master_addr;
        unsigned short master_port = 0;
        // 更新配置
        void updateConfig();
        // 更新主机名转换为IP的缓存
        bool updateHostCache();
        // 输出连接相关信息
        void printInfo();
        // 连接到主节点
        socketinf getMasterConnect();
        // 注册一个任务
        void registerTask(unsigned char flag, ClientTaskExecutor *executor) ;

        /**
         * 取一个客户端任务对象
         * @param flag 任务标志，其包含在枚举数据`TaskFlak`中
         */
        ClientTaskExecutor* getClientTaskExecutor(unsigned char flag);

        /**
         * 执行一个客户端任务，本地将执行对应的clientAction，服务器将执行对应的serverAction
         * @param flag 任务标志，其包含在枚举数据`TaskFlak`中
         * @param arg 连同发起任务时，要发送的数据
         * @param len arg的数据长度
         * @param sync true为开启同步模式，方法将阻塞至任务执行完成
         */
        void executeClientTask(unsigned char flag, const char * arg = NULL, size_t len = 0, bool sync = true);

        /**
         * 发起一个任务请求，服务器将执行对应的serverAction，与executeClientTask不同的是，发起方将不执行clientAction，该方法返回SocketIO将任务处理权移交给后续代码  
         * 服务端执行出错时将抛出 *TaskFailedException* 异常
         * @param flag 任务标志，其包含在枚举数据`TaskFlak`中
         * @param arg 连同发起任务时，要发送的数据
         * @param len arg的数据长度
         * @return SocketIO
         * @throw SocketException, TimeoutException, TaskFailedException
         */
        SocketIO launchTask(unsigned char taskFlag, const char * arg = NULL, size_t len = 0);
    private:
        void ExecuteClientTaskCore(unsigned char flag, const char * arg, size_t len);
        std::map<unsigned char, ClientTaskExecutor*> taskMap;
        char master_ip[16] = {0};
};
extern NodeHandler nodeHandler;
#endif